//? 超时重新请求 到达一定次数后输出缓存内容

//? 重试方法
function retry(callback, retryTime) {
    //? 当然是返回Promise
    return new Promise((resolve, reject) => {
        //? 这里面对callback来执行then
        callback().then(res => {
            resolve(res)
        },err => {
            --retryTime
            if (retryTime === 0) reject(err)
            else {
                //? 重试 这里也在递归then 即调用了retry函数并将其结果通过.then(resolve,reject)处理。
                //? 当retry(callback,retryTime)返回的 Promise 对象状态变为 resolved（即操作成功）时，成功回调函数resolve会被执行。这样，我们可以在成功回调函数中处理操作成功的结果。即resolve(前面拿到的结果)
                //? 当retry(callback,retryTime)返回的 Promise 对象状态变为 rejected（即操作失败）时，失败回调函数reject会被执行。这样，我们可以在失败回调函数中处理操作失败的结果。
                retry(callback,retryTime).then(resolve,reject)
            }
        })
    })
}

let count = 0
retry(() => {
    console.log(++count)
    return count === 3 ? Promise.resolve('success') : Promise.reject('failed')
}, 3).then((value) => console.log(value), (err) => console.log(err))


//? 重试方法2
function limitTime(txt,time) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(txt)
        }, time)
    })
}
function retry(request, count, limitTime) {
    return new Promise((resolve, reject) => {
        Promise.race([request, limitTime]).then(res => {
            if (res === '超时') {
                if (count > 0) {
                    count--
                    console.log('retry', count)
                    retry(request, count, limitTime).then(resolve, reject)
                }
                else reject('no')
            }
            else resolve('success')
        }, err => {
            reject(err)
        })
    })
}
retry(limitTime('1',2000), 3, limitTime('超时',1000)).then((res) => console.log(res), (err) => console.log(err))
retry(limitTime('1',2000), 3, limitTime('超时',1000)).then((res) => console.log(res), (err) => console.log(err))
retry(limitTime('1',2000), 3, limitTime('超时',3000)).then((res) => console.log(res), (err) => console.log(err))
